Previous months’ reports




1. Summary

1.1 Summary table

A total of 736,783 persons have been reached by EiE activities in 2023, of which 384,197 were boys, 339,365 were girls, 6,326 were men and 6,895 were women. Below is a summary by indicator.


Summary statistics for EIE 5Ws reporting, 30 November 2023

Indicator

Partners1

Counties

November_reached

Total_reached

Target

%Target_reached

1. Access ECD spaces/schools

15

15

4,848

432,189

1,201,151

35.98

2. Feeding programmes

10

8

5,844

154,237

784,647

19.66

3. Teaching materials

14

14

20,604

258,042

600,578

42.97

4. Safe water, personal hygiene

8

7

44,783

88,348

784,647

11.26

5. Educators resilience enhancing

21

16

1,460

10,815

6,018

179.71

6. Children resilience enhancing

14

15

10,667

139,542

154,729

90.18

7. Construction and rehabilitation

3

3

34

35,933

0

100.00

Total

41

20

22,819

736,7832

2,146,5452

34.32

1Only implementing partners

2Only the sum of indicators 1, 2, 5 and 6




1.2 By sex and age


Only Indicator 6, Children benefiting from resilience-enhancing programming, sees a higher proportion of females reached over men.





1.3 By county

50.19% of all beneficiaries reached originate from Turkana, though it only has 14.05% of the targeted population.


IPC data extracted from here.




1.4 Gaps

As the drought response draws to a close, it is necessary to review the allocation of resources i.e. have they been fair and proportional to the needs identified. As mentioned, county-level targets were set in line with the IPC and are considered valid.



Substantial deviation from targets has been observed, including areas such as Turkana where targets have been greatly exceeded:


Gaps between reached and targets

County

Target

Reached

Gap

Gap%

Mandera

339,483

85

339,398

99.97

Makueni

201,321

688

200,633

99.66

Garissa

268,844

7,273

261,571

97.29

Wajir

258,474

17,345

241,129

93.29

Baringo

86,322

9,101

77,221

89.46

Kwale

60,767

9,410

51,357

84.51

Marsabit

127,609

26,761

100,848

79.03

Samburu

72,788

24,046

48,742

66.96

Narok

83,337

29,323

54,014

64.81

West Pokot

81,626

32,489

49,137

60.20

Tana River

45,347

19,142

26,205

57.79

Isiolo

30,518

22,402

8,116

26.59

Turkana

237,959

469,948

-231,989

-97.49

Kilifi

0

21,033

-21,033

-100.00

Taita Taveta

0

45

-45

-100.00

Meru

0

26,104

-26,104

-100.00

Kajiado

0

39,600

-39,600

-100.00

Homa Bay

0

188,301

-188,301

-100.00

Nairobi

0

115

-115

-100.00

2. Progress by indicator


2.1.1 Overall progress


The rate of increase in the number of beneficiaries reached has yet to plateau, with only indicators 2 and 6 seeing slight slowdowns in the number of beneficiaries reached each month.




2.1.2 Reached by indicator




2.2.1 Access to ECD spaces/schools


EiE Indicator 1, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

1. Access ECD spaces/schools

15

15

4,848

432,189

1,201,151

35.98



In November 2023, 4,848 persons were reached by interventions contributing to this indicator, of which 3,028 were boys and 1,820 were girls.





2.2.2 School feeding programmes


EiE Indicator 2, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

2. Feeding programmes

10

8

5,844

154,237

784,647

19.66



In November 2023, 5,844 persons were reached by interventions contributing to this indicator, of which 3,048 were boys and 2,730 were girls.





2.2.3 Teaching and learning materials


EiE Indicator 3, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

3. Teaching materials

14

14

20,604

258,042

600,578

42.97



In November 2023, 20,604 persons were reached by interventions contributing to this indicator, of which 6,425 were boys, 3,686 were girls, 7,035 were men and 3,458 were women.





2.2.4 Safe water, personal hygiene


EiE Indicator 4, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

4. Safe water, personal hygiene

8

7

44,783

88,348

784,647

11.26



In November 2023, 44,783 persons were reached by interventions contributing to this indicator, of which 19,070 were boys and 12,562 and were girls.





2.2.5 Educators trained in resilience enhancing programmes


EiE Indicator 5, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

5. Educators resilience enhancing

21

16

1,460

10,815

6,018

179.71



In November 2023, 1,460 persons were reached by interventions contributing to this indicator, of which 614 were men and 846 and were women.





2.2.6 Children benefited from resilience enhancing programmes


EiE Indicator 6, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

6. Children resilience enhancing

14

15

10,667

139,542

154,729

90.18



In November 2023, 10,667 persons were reached by interventions contributing to this indicator, of which 4,546 were boys and 6,121 and were girls.





2.2.7 Children benefited from construction and rehabilitation


EiE Indicator 7, as of 30 November 2023

Indicator

Partners

Counties

November_reached

Total_reached

Target

%Target_reached

7. Construction and rehabilitation

3

3

34

35,933

0

100


To note: targets have not been set for indicator 7.



In November 2023, 34 persons were reached by interventions contributing to this indicator, of which 0 were boys and 0 and were girls.

This activity has no targets.




3. Partners

3.1 Operational presence of implementing partners



Below is an interactive table which adds detail to the map above, serving additional information for coordination – allowing interested parties to search by county or partner.

The column #Activities refers to the number of Education activities implemented by said partner in each county. Each column can be sorted with the arrows next to each column name. Each column can also be filtered by typing into the search bar below each column name. Only completed activities have been included.

Download the dataset from the table below here.





3.2 Summary by implementing partner

The table below breaks down persons reached by partner.


Summary by implementing partner

implementing_partner

reached1

counties

activities

%total2

Finn Church Aid

518,933

5

7

46.37

Women Educational Researchers of Kenya

83,133

5

4

7.43

Jesuit Refugee Service

77,504

1

3

6.93

Food for the Hungry

58,967

2

7

5.27

Windle International

57,307

1

3

5.12

Norwegian Refugee Council

52,914

2

3

4.73

Lifeskills Promoters

41,564

3

5

3.71

Save the Children

38,889

4

3

3.48

World Vision Kenya

35,584

6

6

3.18

UNICEF

34,732

2

1

3.10

Feed the Children

28,711

3

1

2.57

Homa Bay County

23,166

1

1

2.07

We World

20,947

2

1

1.87

AVSI Foundation

9,768

2

3

0.87

Ministry of Education

8,294

2

2

0.74

Nawiri Children Development Program

6,652

5

2

0.59

Edukans

4,734

1

1

0.42

Action for Sustainable Change

4,160

1

3

0.37

Special Olympics Kenya

2,284

3

3

0.20

Mondi

2,197

1

1

0.20

Qatar Charity

1,541

1

1

0.14

The Girl Child Network

1,050

2

1

0.09

Frontiers Community Development Organization

1,044

1

1

0.09

Tana North and Tana Delta

882

1

1

0.08

Bartabwa

849

1

1

0.08

County Director of Education Mandera

600

1

2

0.05

Missionary Sisters of the Catechism

585

1

1

0.05

Evangelizing Sisters of Mary

458

1

4

0.04

County Director of Education Wajir

409

1

2

0.04

SMB

270

1

1

0.02

MoE, KNATCOM, STEM Impact Centre

260

2

1

0.02

ERIKs Development Partner

249

1

1

0.02

Servants of the Poor

202

1

1

0.02

Dignitas

135

1

1

0.01

MOE/TSC

60

1

1

0.01

Voluntary Service Overseas

42

1

1

0.00

Futebol da Forcaa

20

1

1

0.00

IWS

10

1

2

0.00

1All indicators as opposed only indicators 1, 2, 5 and 6

2Percentage of reached for all indicators




3.3 Summary by Lead Organisation

Summary by lead organisation

lead_organisation

reached1

counties

activities

%total2

UNICEF

433,004

14

6

38.69

Finn Church Aid

332,789

4

6

29.74

Food for the Hungry

58,967

2

7

5.27

World Vision Kenya

46,871

7

6

4.19

34,792

3

2

3.11

Jesuit Refugee Service

33,610

1

3

3.00

Save the Children

29,323

4

3

2.62

Feed the Children

28,711

3

1

2.57

Lifeskills Promoters

26,410

2

4

2.36

Population Council

23,166

1

1

2.07

We World

20,947

2

1

1.87

Windle International

18,687

1

1

1.67

AVSI Foundation

10,623

5

6

0.95

ChildFund Kenya

7,696

5

2

0.69

Edukans

4,734

1

1

0.42

Action for Sustainable Change

4,160

1

3

0.37

Qatar Charity

1,541

1

1

0.14

UNESCO

1,330

3

3

0.12

Missionary Sisters of the Catechism

500

1

1

0.04

Special Olympics Kenya

423

2

1

0.04

Voluntary Service Overseas

291

2

1

0.03

Dignitas

135

1

1

0.01

SMB

135

1

1

0.01

KENYA NATIONAL COMMISSION FOR UNESCO

115

1

2

0.01

Life Skills Promoters

111

1

2

0.01

Evangelizing Sisters of Mary

35

1

1

0.00

1All indicators as opposed only indicators 1, 2, 5 and 6

2Percentage of reached for all indicators

4. Schools and education level

4.1 Schools

The number of schools reached by school feeding programmes and WASH in schools interventions to-date are:



However, reporting the overall number of schools reached by all EiE interventions is much more challenging.

Whilst all partners working on indicators 2 and 4 submitted the number of schools they were working in, the same is not true for the other indicators. Only indicators 2 and 4 require the reporting of the number of schools.

Additionally, it is not possible to know which of these schools are repeats, since only the number of schools reached per sub-county are reported, not the individual facilites themselves.




5. Reference maps and tables

5.1 Reference maps

IPC data extracted from here.




5.2 Reference table

Download the EiE 5Ws data here

As a refresher for the reference table below, the indicators are:


indicator

indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas

indicator 2 # of schools/ECD spaces with feeding programmes

indicator 3 # of learners and teachers reached with learning and teaching materials

indicator 3 #of learners reaached and teachers reached with learning and teaching materials

indicator 4 # of school with adequate quantity of safe water for drinking and personal hygiene

indicator 4 # of schools with adequate quantities of safe water for drinking and personal hygiene

indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc)

indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc)

indicator 7 # of children benefitting from child-friendly environment (any construction or rehabilitation)





LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiMzAgTm92ZW1iZXIgMjAyMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGNvbGxhcHNlZDogbm8NCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCnBhcmFtczogDQogIHJlcG9ydF9kYXRlOiAiMzAgTm92ZW1iZXIgMjAyMyINCiAgcmVwb3J0X21vbnRoOiAiTm92ZW1iZXIiDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShhbnl0aW1lKQ0KbGlicmFyeSh0aWR5dGV4dCkNCmxpYnJhcnkoZ2dzZmxhYmVsKQ0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBJbnN0YWxsYXRpb24gb2YgbWRlcHJpdiBwYWNrYWdlDQojIGluc3RhbGwgcGFja2FnZSBkZXZ0b29scyBpZiBub3QgeWV0IGluc3RhbGxlZA0KIyAgIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikNCg0KIyBpbnN0YWxsIGZhc3QgZnJvbSBHaXRIdWIgd2l0aG91dCB2aWduZXR0ZXMgDQojICAgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJhLWJlbmluaS9tZGVwcml2IiwgYnVpbGRfdmlnbmV0dGVzID0gRkFMU0UNCg0KIyBBbHRlcm5hdGl2ZWx5LCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBoZXJlOiBodHRwczovL2EtYmVuaW5pLmdpdGh1Yi5pby9tZGVwcml2Lw0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KIyBtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCiMgRml4aW5nIGRhdGVzDQpuYW1lX3RvX2RhdGUgPC0gZnVuY3Rpb24oeCkgew0KICBsdWJyaWRhdGU6Om1keShpZmVsc2UoeCAlaW4lIGMobW9udGgubmFtZSwgbW9udGguYWJiKSwgcGFzdGUwKHgsICIvMDEvMjAyMyIpLCB4KSkNCn0NCmBgYA0KDQpgYGB7ciBkYXRhfQ0KIyBSdW4gdGhpcyBpZiB5b3UgbmVlZCB0bw0KIyBybWFya2Rvd246OnJlbmRlcihpbnB1dCA9ICI1V3NfY2xlYW5pbmdfc2NyaXB0LlJtZCIpDQoNCmxvY2F0aW9ucyA8LSByZWFkX3hsc3goIi4vZGF0YS9rZW5fYWRtaW5ib3VuZGFyaWVzX3RhYnVsYXJkYXRhLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICJBRE0yIikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCnNpdHJlcF90YWJsZSA8LSByZWFkX3hsc3goIi4vZGF0YS9zaXRyZXBfcmVzdWx0c190YWJsZS54bHN4IikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCnRhcmdldHMgPC0gcmVhZF9jc3YoIi4vZGF0YS9laWVfdGFyZ2V0cy5jc3YiKQ0KDQpwY29kZTFfc2hhcGUgPC0gDQogIHNmOjpzdF9yZWFkKCIuL2RhdGEva2VuX2FkbV9pZWJjXzIwMTkxMDMxX3NocC9rZW5fYWRtYm5kYV9hZG0xX2llYmNfMjAxOTEwMzEuc2hwIiwgDQogICAgICAgICAgcXVpZXQgPSBUUlVFKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KaXBjIDwtIHJlYWRfY3N2KCIuL2RhdGEvaXBjLmNzdiIpDQoNCnBhcnRuZXJfbGlzdF9jb3VudGllcyA8LSByZWFkX2NzdigiLi9kYXRhL3BhcnRuZXJfbGlzdF9jb3VudGllcy5jc3YiKSAlPiUgDQogIGZpbHRlcihwYXJ0bmVyX3R5cGUgPT0gImltcGxlbWVudGluZ19wYXJ0bmVyIikNCg0KZWllIDwtIHJlYWRfY3N2KCIuL2RhdGEvZWllXzV3cy5jc3YiKSAlPiUgDQogICMgZmlsdGVyKCFpcy5uYShpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChib3lzID0gMCwgZ2lybHMgPSAwLCBtZW4gPSAwLCB3b21lbiA9IDApKSAlPiUgDQogICMgVG90YWwgcmVhY2hlZCBvZiBpbmRpY2F0b3IgMSBpcyBvbmx5IGJveXMgYW5kIGdpcmxzIA0KICBtdXRhdGUodG90YWxfcmVhY2hlZCA9IGNhc2Vfd2hlbigNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwgImNoaWxkcmVuIGFuZCB5b3V0aCBhY2Nlc3NpbmcgRUNEIHNwYWNlcy9zY2hvb2xzIGluIGRyb3VnaHQgYWZmZWN0ZWQgYXJlYXMiKSB+IA0KICAgICAgYm95cyArIGdpcmxzLA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiNSAjfDUuMXw1LjJ8NS4zIikgfiBtZW4gKyB3b21lbiwNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwgImNoaWxkcmVuIGFuZCB5b3V0aCBiZW5lZml0aW5nIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcyIpIH4gYm95cyArIGdpcmxzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IHRvdGFsX3JlYWNoZWQpKSAlPiUgDQogICMgUmVtb3ZlIGZvciBEZWNlbWJlciByZXBvcnQgDQogIGZpbHRlcihtb250aCAlb3V0JSBjKCJEZWNlbWJlciIpKQ0KDQpgYGANCg0KW1ByZXZpb3VzIG1vbnRocycgcmVwb3J0c10oaHR0cHM6Ly9rZW55YS1laWUtd2cuZ2l0aHViLmlvLykNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyAxLiBTdW1tYXJ5DQoNCiMjIDEuMSBTdW1tYXJ5IHRhYmxlDQoNCmBgYHtyfQ0Kc3VtX3N0YXRzIDwtIGVpZSAlPiUgIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoY291bnR5KSwgDQogICAgICAgICAgICByZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIG1lbiA9IHN1bShtZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDUiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgd29tZW4gPSBzdW0od29tZW5bc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDUiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDYiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdpcmxzID0gc3VtKGdpcmxzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIHJlYWNoZWRfMTI1NiA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFtzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCImIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCg0KDQoNCmBgYA0KDQpBIHRvdGFsIG9mIGByIHN1bV9zdGF0cyAlPiUgcHVsbChyZWFjaGVkXzEyNTYpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIGhhdmUgYmVlbiByZWFjaGVkIGJ5IEVpRSBhY3Rpdml0aWVzIGluIDIwMjMsIG9mIHdoaWNoIGByIHN1bV9zdGF0cyAlPiUgcHVsbChib3lzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwoZ2lybHMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLCBgciBzdW1fc3RhdHMgJT4lIHB1bGwobWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIHN1bV9zdGF0cyAlPiUgcHVsbCh3b21lbikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgd29tZW4uIEJlbG93IGlzIGEgc3VtbWFyeSBieSBpbmRpY2F0b3IuDQoNCjxicj4NCg0KYGBge3J9DQoNCg0Kc3VtbWFyeV90YWJsZSA8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGgsIHRvdGFsX3JlYWNoZWQsIE5BX2ludGVnZXJfKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCAgIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0obGF0ZXN0X3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGFkb3JuX3RvdGFscygicm93IiwsLCwgbGF0ZXN0X3JlYWNoZWQsIHRvdGFsX3JlYWNoZWQpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkcGFydG5lcnMsIHBhcnRuZXJzKSwgDQogICAgICAgICBjb3VudGllcyA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgc3VtX3N0YXRzJGNvdW50aWVzLCBjb3VudGllcyksIA0KICAgICAgICAgdG90YWxfcmVhY2hlZCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRyZWFjaGVkXzEyNTYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9yZWFjaGVkKSwgDQogICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fc3RhdHMkbGF0ZXN0X3JlYWNoZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQpKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRhcmdldCA9IHN1bShjb3VudHlfdGFyZ2V0KSksIA0KICAgICAgICAgICAgYnkgPSAiaW5kaWNhdG9yX3Nob3J0IikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgbXV0YXRlKHRhcmdldCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyAlPiUgZGlzdGluY3QoY291bnR5LCBjb3VudHlfb3ZlcmFsbF90YXJnZXQpICU+JSB7c3VtKC4kY291bnR5X292ZXJhbGxfdGFyZ2V0KX0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCksIA0KICAgICAgICAgdGFyZ2V0ID0gaWZlbHNlKGlzLm5hKHRhcmdldCksIDAsIHRhcmdldCkpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQodG90YWxfcmVhY2hlZCAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocGMpLCAxMDAsIHBjKSkgJT4lDQogIHNlbGVjdChpbmRpY2F0b3IgPSBpbmRpY2F0b3Jfc2hvcnQsIHBhcnRuZXJzLCBjb3VudGllcywgDQogICAgICAgICBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCwgdGFyZ2V0LCBgJXRhcmdldF9yZWFjaGVkYCA9IHBjKSAlPiUNCiAgc2VsZWN0X2FsbCh+IGdzdWIoImxhdGVzdCIsIA0KICAgICAgICAgICAgICAgICAgICBwYXJhbXMkcmVwb3J0X21vbnRoLCAuKSkgJT4lDQogIHNlbGVjdF9hbGwofiBzdHJfdG9fdGl0bGUoLikpICANCg0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBFSUUgNVdzIHJlcG9ydGluZywgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvbnRzaXplKGkgPSAxOjcsIGogPSAxLCBzaXplID0gOSkgJT4lIA0KICBmb250c2l6ZShzaXplID0gOSwgcGFydCA9ICJoZWFkZXIiKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICIxIiwgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiT25seSBpbXBsZW1lbnRpbmcgcGFydG5lcnMiKSkgJT4lIA0KICBmb290bm90ZShpID0gOCwgaiA9IDU6NiwgcmVmX3N5bWJvbHMgPSAiMiIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgdGhlIHN1bSBvZiBpbmRpY2F0b3JzIDEsIDIsIDUgYW5kIDYiKSkNCg0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4yIEJ5IHNleCBhbmQgYWdlDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlKGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKG1lbiwgd29tZW4pLCB+IGlmZWxzZShzdHJfZGV0ZWN0KGluZGljYXRvciwgIjEiKSwgMCwgLikpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiBzdW0oLiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUodG90YWxfcmVhY2hlZCA9IGJveXMgKyBnaXJscyArIG1lbiArIHdvbWVuLCANCiAgICAgICAgIGZlbWFsZSA9ICh3b21lbiArIGdpcmxzKSAvIHRvdGFsX3JlYWNoZWQsIA0KICAgICAgICAgbWFsZSA9IChib3lzICsgbWVuKSAvIHRvdGFsX3JlYWNoZWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlLCBtYWxlKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJzZXgiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwYyIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIGZpbGwgPSBzZXgpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IHBjLCANCiAgICAgICAgICAgICAgICB5ID0gaW5kaWNhdG9yX3Nob3J0LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSwgDQogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NDM5ODMiLCAiIzM1Yjc3OSIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJTZXggYnJlYWtkb3duIGJ5IGluZGljYXRvciIpICANCg0KYGBgDQoNCjxicj4NCg0KT25seSBJbmRpY2F0b3IgNiwgQ2hpbGRyZW4gYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UtZW5oYW5jaW5nIHByb2dyYW1taW5nLCBzZWVzIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgZmVtYWxlcyByZWFjaGVkIG92ZXIgbWVuLg0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JQ0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCB+IHN1bSguKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKG1lbiwgd29tZW4sIGJveXMsIGdpcmxzKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0eXBlIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmVhY2hlZCIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBzdHJfdG9fdGl0bGUodHlwZSksIA0KICAgICAgICAgdHlwZSA9IGZjdF9yZWxldmVsKHR5cGUsIGMoIk1lbiIsICJXb21lbiIsICJCb3lzIiwgIkdpcmxzIikpKSAlPiUgDQogICMgWW91J3JlIGp1c3QgZmlsdGVyaW5nIHRoZW0gb3V0IG1hbnVhbGx5DQogIG11dGF0ZShyZWFjaGVkID0gY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiQm95cyIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIHR5cGUgPT0gIkdpcmxzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgdHlwZSA9PSAiTWVuIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgdHlwZSA9PSAiV29tZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiB0eXBlID09ICJNZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiB0eXBlID09ICJXb21lbiIgfiAwLA0KICAgIFRSVUUgfiByZWFjaGVkDQogICkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gdHlwZSwgeCA9IHJlYWNoZWQsIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEocmVhY2hlZCkpLCANCiAgICAgICAgICAgIGhqdXN0ID0gImlud2FyZCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEgLyAxMDAwLCBzdWZmaXggPSAiSyIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjIsIGVuZCA9IC45KSArIA0KICBmYWNldF93cmFwKH4gaW5kaWNhdG9yX3Nob3J0KSArIA0KICBsYWJzKHggPSAiUGVyc29ucyByZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJSZWFjaCBkaXNhZ2dyZWdhdGVkIGJ5IHNleCwgYWdlIGFuZCBpbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4zIEJ5IGNvdW50eQ0KDQpgYGB7cn0NCmN1bV9wYzwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHRhcmdldCA9IDApKSAlPiUgDQogIG11dGF0ZShwY19iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY190YXJnZXQgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShjdW1fcGMgPSBjdW1zdW0ocGNfYmVuKSkNCmBgYA0KDQpgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChjdW1fcGMpYCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBvcmlnaW5hdGUgZnJvbSBUdXJrYW5hLCB0aG91Z2ggaXQgb25seSBoYXMgYHIgY3VtX3BjICU+JSBmaWx0ZXIoY291bnR5ID09ICJUdXJrYW5hIikgJT4lIHB1bGwocGNfdGFyZ2V0KWAlIG9mIHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uLg0KDQo8YnI+DQoNCmBgYHtyfQ0KDQplaWUgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlLCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lICANCiAgbXV0YXRlKGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgc2VjdG9yX3JlYWNoZWQpKSAlPiUgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIGxlZnRfam9pbihpcGMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtMV9wY29kZSwgcGVyY2VudF9waGFzZV9wMyksIA0KICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHNlY3Rvcl9yZWFjaGVkLCB0YXJnZXQpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBpZmVsc2UodHlwZSA9PSAidGFyZ2V0IiwgIkNvdW50eSBUYXJnZXQiLCAiU2VjdG9yIFJlYWNoZWQiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodmFsdWUgPSAwKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHZhbHVlLCANCiAgICAgICAgICAgICB5ID0gY291bnR5LCANCiAgICAgICAgICAgICBmaWxsID0gcGVyY2VudF9waGFzZV9wMykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHZhbHVlKSksIGhqdXN0ID0gImlud2FyZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IG51bWJlcl9mb3JtYXQoc2NhbGUgPSAxLzEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50KSArIA0KICBmYWNldF9ncmlkKH4gdHlwZSwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKSArIA0KICBsYWJzKGZpbGwgPSAiJSBJUEMzKyIsDQogICAgICAgeCA9ICJUYXJnZXQvcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgY2FwdGlvbiA9ICJDb2xvdXJzIHJlZmVyIHRvICUgb2YgY291bnR5IHBvcHVsYXRpb24gaW4gSVBDIHBoYXNlIDMgb3IgYWJvdmUuIEhvbWEgQmF5IHdhcyBub3QgYXNzZXNzZWQgYXMgcGFydCBvZiB0aGUgSVBDIENsYXNzaWZpY2F0aW9uIiwgDQogICAgICAgdGl0bGUgPSAiQ29tcGFyaXNvbiBiZXR3ZWVuIHRhcmdldHMgYW5kIHJlYWNoZWQiKSArDQogIHRoZW1lKCMgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgICMgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQpgYGANCg0KSVBDIGRhdGEgZXh0cmFjdGVkIGZyb20gW2hlcmVdKGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnL2lwYy1jb3VudHJ5LWFuYWx5c2lzL2RldGFpbHMtbWFwL2VuL2MvMTE1NjIxMC8/aXNvMz1LRU4pLg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS40IEdhcHMNCg0KQXMgdGhlIGRyb3VnaHQgcmVzcG9uc2UgZHJhd3MgdG8gYSBjbG9zZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJldmlldyB0aGUgYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgaS5lLiBoYXZlIHRoZXkgYmVlbiBmYWlyIGFuZCBwcm9wb3J0aW9uYWwgdG8gdGhlIG5lZWRzIGlkZW50aWZpZWQuIEFzIG1lbnRpb25lZCwgY291bnR5LWxldmVsIHRhcmdldHMgd2VyZSBzZXQgaW4gbGluZSB3aXRoIHRoZSBJUEMgYW5kIGFyZSBjb25zaWRlcmVkIHZhbGlkLg0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9N30NCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwIHwgdGFyZ2V0ID4gMCkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKGdhcCA9IHRhcmdldCAtIHNlY3Rvcl9yZWFjaGVkLCANCiAgICAgICAgIGdhcF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShnYXAgLyB0YXJnZXQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FwIC8gdGFyZ2V0KSkgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMoc2VjdG9yX3JlYWNoZWQsIHRhcmdldCwgZ2FwLCBnYXBfcGMpLCB+IGFzLm51bWVyaWMoLikpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBtdXRhdGUobGFiZWwgPSBwYXN0ZTAoY29tbWEoZ2FwKSwgIlxuIiwgcGVyY2VudChnYXBfcGMpKSwgDQogICAgICAgICBsYWJlbCA9IGlmZWxzZShzdHJfZGV0ZWN0KGxhYmVsLCAiTkEiKSwgIiIsIGxhYmVsKSkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAwLjEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IGdhcF9wYykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBsYWJlbCksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk1MCIsIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJ0dXJibyIsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMywgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0xLCAtLjUsIDAsIC41LCAuOTkpKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJHYXBzIGluIERyb3VnaHQgUmVzcG9uc2UiLA0KICAgICAgIHN1YnRpdGxlID0gIkluIHRlcm1zIG9mIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFuZCAlIG9mIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJHYXAgJSIpDQogIA0KICANCmBgYA0KDQo8YnI+DQoNClN1YnN0YW50aWFsIGRldmlhdGlvbiBmcm9tIHRhcmdldHMgaGFzIGJlZW4gb2JzZXJ2ZWQsIGluY2x1ZGluZyBhcmVhcyBzdWNoIGFzIFR1cmthbmEgd2hlcmUgdGFyZ2V0cyBoYXZlIGJlZW4gZ3JlYXRseSBleGNlZWRlZDoNCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwIHwgdGFyZ2V0ID4gMCkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKGdhcCA9IHRhcmdldCAtIHNlY3Rvcl9yZWFjaGVkLCANCiAgICAgICAgIGdhcF9wYyA9IGlmZWxzZShpcy5pbmZpbml0ZShnYXAgLyB0YXJnZXQgKiAxMDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChnYXAgLyB0YXJnZXQgKiAxMDAsIGRpZ2l0cyA9IDIpKSkgJT4lIA0KICBzZWxlY3QoQ291bnR5ID0gY291bnR5LCANCiAgICAgICAgIFRhcmdldCA9IHRhcmdldCwNCiAgICAgICAgIFJlYWNoZWQgPSBzZWN0b3JfcmVhY2hlZCwgDQogICAgICAgICBHYXAgPSBnYXAsIA0KICAgICAgICAgYEdhcCVgID0gZ2FwX3BjKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhgR2FwJWApKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNykgJT4lIA0KICBzZXRfY2FwdGlvbigiR2FwcyBiZXR3ZWVuIHJlYWNoZWQgYW5kIHRhcmdldHMiKQ0KYGBgDQoNCiMgMi4gUHJvZ3Jlc3MgYnkgaW5kaWNhdG9yDQoNCjxicj4NCg0KIyMgMi4xLjEgT3ZlcmFsbCBwcm9ncmVzcw0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQoNCmxpbmVfdmFsdWVzIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IG5hbWVfdG9fZGF0ZShtb250aCkpICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcl9zaG9ydCkgJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4sIGNvbG91ciA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIHN0YXRfc21vb3RoKGdlb20gPSAibGluZSIsIGFwaGEgPSAuMywgc3BhbiA9IC41KSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICB4ID0gLUluZiwgeSA9IEluZiwgaGp1c3QgPSAtMC4xNSwgdmp1c3QgPSAwLjksIGRhdGEgPSBsaW5lX3ZhbHVlcykgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgZmFjZXRfd3JhcCh+aW5kaWNhdG9yX3Nob3J0LCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgaW50ZXJ2ZW50aW9ucyIsIA0KICAgICAgIHRpdGxlID0gcGFzdGUwKCJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpLA0KICAgICAgIHN1YnRpdGxlID0gIkluZGljYXRvciBzdWJ0b3RhbCBpbiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIGVhY2ggZmFjZXQiKSANCiAgDQoNCg0KYGBgDQoNCjxicj4NCg0KVGhlIHJhdGUgb2YgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaGFzIHlldCB0byBwbGF0ZWF1LCB3aXRoIG9ubHkgaW5kaWNhdG9ycyAyIGFuZCA2IHNlZWluZyBzbGlnaHQgc2xvd2Rvd25zIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGVhY2ggbW9udGguDQoNCjxicj48YnI+PGJyPg0KDQojIyAyLjEuMiBSZWFjaGVkIGJ5IGluZGljYXRvcg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHJlYWNoZWQsIHkgPSBmY3RfcmV2KGluZGljYXRvcl9zaG9ydCkpKSArIA0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSAuOCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHJlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgbGFicyh4ID0gcGFzdGUwKCJUb3RhbCByZWFjaGVkIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSksIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiUGVyc29ucyByZWFjaGVkIGJ5IGVhY2ggRWlFIGluZGljYXRvciIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KYGBge3J9DQpiZW5fcGxvdCA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGNvdW50eSkpICsgDQogICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwYykpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcyksIGhqdXN0ID0gImlud2FyZCIpLCANCiAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIpICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50LCBiZWdpbiA9IC4yKSArIA0KICAgIGxhYnModGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgICB4ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICBmaWxsID0gIiUgcmVhY2hlZCIpIA0KfQ0KDQpwY19wbG90IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICAgIGZ1bGxfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGNvdW50eSkpICsgDQogICAgZ2VvbV9jb2woYWVzKGZpbGwgPSBwYykpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gLjEpLCBoanVzdCA9ICJpbndhcmQiKSwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArDQogICAgc2NhbGVfZmlsbF92aXJpZGlzKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50LCBiZWdpbiA9IC4yKSArIA0KICAgIGxhYnModGl0bGUgPSAiJSBvZiB0YXJnZXQgcmVhY2hlZCIsIA0KICAgICAgICAgeCA9ICIlIHJlYWNoZWQiLCANCiAgICAgICAgIHkgPSAiIiwgDQogICAgICAgICBmaWxsID0gIiUgcmVhY2hlZCIpICsNCiAgICANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQp9DQpgYGANCg0KYGBge3J9DQp0YXJnZXRzX3JhbmdlIDwtIHRhcmdldHMgJT4lIA0KICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKHRhcmdldCA9IHN1bShjb3VudHlfdGFyZ2V0LCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbmRpY2F0b3Jfc2hvcnQsIHZhbHVlc19mcm9tID0gdGFyZ2V0KSAlPiUgDQogIHNldE5hbWVzKGMoImNvdW50eSIsICJpbmRpY2F0b3IxIiwgImluZGljYXRvcjIiLCAiaW5kaWNhdG9yMyIsICJpbmRpY2F0b3I0IiwgDQogICAgICAgICAgICAgImluZGljYXRvcjUiLCAiaW5kaWNhdG9yNiIpKSAlPiUgDQogIG11dGF0ZShpbmRpY2F0b3I3ID0gMCkNCg0KaW5kaWNhdG9yX21hcCA8LSBmdW5jdGlvbih0YmwsIGluZGljYXRvcl9udW1iZXIsIHBsb3Rfb3B0aW9uKSB7DQogIA0KICBwbG90X29wdGlvbiA8LSBlbnF1byhwbG90X29wdGlvbikNCiAgaW5kaWNhdG9yX251bWJlciA8LSBlbnF1byhpbmRpY2F0b3JfbnVtYmVyKQ0KICANCiAgdGJsICU+JSANCiAgICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICEhaW5kaWNhdG9yX251bWJlcikpICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAhIWluZGljYXRvcl9udW1iZXIpKSAlPiUNCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCB8IGNvdW50eV90YXJnZXQgPiAwKSAgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIG5hbmlhcjo6cmVwbGFjZV93aXRoX25hKGxpc3QoYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgbGVmdF9qb2luKGxvY2F0aW9ucyAlPiUgDQogICAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5ID0gYWRtMV9lbiwgYWRtMV9wY29kZSksIA0KICAgICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgDQogICAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIGJ5ID0gYygiYWRtMV9wY29kZSIpKSAlPiUNCiAgICBzdF9hc19zZigpICU+JSANCiAgICBnZ3Bsb3QoKSArIA0KICAgIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgICAgYWVzKGZpbGwgPSAhIXBsb3Rfb3B0aW9uKSkgKyANCiAgICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gY29tbWEoISFwbG90X29wdGlvbikpLA0KICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwNCiAgICAgICAgICAgICAgICAgc2l6ZSA9IDIuNSkgKyANCiAgICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgICB0aGVtZV92b2lkKCkgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKQ0KICAgIA0KfQ0KDQpgYGANCg0KIyMjIDIuMi4xIEFjY2VzcyB0byBFQ0Qgc3BhY2VzL3NjaG9vbHMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIxIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMSwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KQ0KDQpgYGANCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiMSIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiMSIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjEpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjEuIEFjY2VzcyB0byBFQ0Qgc3BhY2VzL3NjaG9vbHMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBDaGlsZHJlbiBhY2Nlc3NpbmcgRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjIgU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjIiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAyLCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjIiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjIiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IyKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIyLiBTY2hvb2wgZmVlZGluZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMi4gRmVlZGluZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjMgVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjMiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciAzLCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjMiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjMiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IzKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIzLiBUZWFjaGluZyBhbmQgbGVhcm5pbmcgbWF0ZXJpYWxzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGdpcmxzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRtZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kd29tZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHdvbWVuLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMy4gVGVhY2hpbmcgbWF0ZXJpYWxzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjQgU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZQ0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjQiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA0LCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjQiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjQiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I0KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI0LiBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KICANCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZSIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjUgRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjUiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA1LCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjUiLCBjb3VudHlfdGFyZ2V0KSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hLnZhbHVlID0gImdyZXk4MCIsIGxpbWl0cyA9IHJhbmdlKGMoMCwgMTgxMykpKSArIA0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgYmVuZWZpY2lhcmllcykgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgd29tZW4uDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMi4yLjYgQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcw0KDQo8YnI+DQoNCmBgYHtyfQ0Kc3VtbWFyeV90YWJsZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KEluZGljYXRvciwgIjYiKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgiRWlFIEluZGljYXRvciA2LCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjYiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I2KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIGdpcmxzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI2LiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi43IENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIGNvbnN0cnVjdGlvbiBhbmQgcmVoYWJpbGl0YXRpb24NCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI3IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNywgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNClRvIG5vdGU6IHRhcmdldHMgaGF2ZSBub3QgYmVlbiBzZXQgZm9yIGluZGljYXRvciA3Lg0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI3IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI3IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNy4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI3IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI3IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscy4NCg0KVGhpcyBhY3Rpdml0eSBoYXMgbm8gdGFyZ2V0cy4NCg0KPGJyPjxicj48YnI+DQoNCiMgMy4gUGFydG5lcnMNCg0KIyMgMy4xIE9wZXJhdGlvbmFsIHByZXNlbmNlIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycw0KDQo8YnI+DQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9N30NCg0KcGFydG5lcl9tYXAgPC0gZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uID0gbl9kaXN0aW5jdChsZWFkX29yZ2FuaXNhdGlvbiksDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpLCANCiAgICAgICAgICAgIHdvbWVuID0gc3VtKHdvbWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBtZW4gPSBzdW0obWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUocmVhY2hlZCA9IG1lbiArIHdvbWVuICsgYm95cyArIGdpcmxzLCANCiAgICAgICAgIG1hbGUgPSBtZW4gKyBib3lzLCANCiAgICAgICAgIGZlbWFsZSA9IHdvbWVuICsgZ2lybHMsIA0KICAgICAgICAgbWFsZV9wYyA9IHJvdW5kKG1hbGUgLyByZWFjaGVkICogMTAwKSwgDQogICAgICAgICBmZW1hbGVfcGMgPSByb3VuZChmZW1hbGUgLyByZWFjaGVkICogMTAwKSkgJT4lICANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoYWRtMV9wY29kZSwgYWNyb255bSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbTFfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGFjcm9ueW0pICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGFjcm9ueW0gPSBwYXN0ZTAoYWNyb255bSwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShhY3JvbnltID0gc3RyX3JlcGxhY2VfYWxsKGFjcm9ueW0sICJDaGlsZEZ1bmQiLCAiQ0YiKSwgDQogICAgICAgICAgICAgICAgICAgICBuX3BhcnRuZXJzID0gc3RyX2NvdW50KGFjcm9ueW0sICIsIikgKyAxKSwgDQogICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgZGF0YSA9IHBjb2RlMV9zaGFwZSkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgIGNvbG91ciA9IGFkbTFfcGNvZGUpKSArDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoIA0KICAgIGNvdW50eSwgIlxuIiwgcGFydG5lcnMpLCANCiAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgICAgICAgICAgICJDb3VudHk6ICIsIGNvdW50eSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIlBhcnRuZXJzOiAiLCBuX3BhcnRuZXJzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUmVhY2hlZDogIiwgY29tbWEodG90YWxfcmVhY2hlZCksICJcbiIsIA0KICAgICAgICAgICAgICAgICJGZW1hbGVfcmVhY2hlZCU6ICIsIGZlbWFsZV9wYywgIiUsICIsICJNYWxlX3JlYWNoZWQlOiAiLCBtYWxlX3BjLCAiJSIsIA0KICAgICAgICAgICAgICAgICJcbiIsICANCiAgICAgICAgICAgICAgICBhY3JvbnltKSksIA0KICAgICAgICAgICAgICAgIHNpemUgPSAzLCBjb2xvdXIgPSAiZ3JheTQwIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLCAzLCA2LCAxMCkpICsgDQogIA0KICB0aGVtZV92b2lkKCkgKyANCiAgIyBSZW1lbWJlciB0aGF0IHlvdSBuZWVkIGd1aWRlX2NvbG9yYmFyLCBub3QgZ3VpZGVfbGVnZW5kDQogICMgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVFJVRSkpICsgDQogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uIGluIEVtZXJnZW5jaWVzIFdvcmtpbmcgR3JvdXAgb3BlcmF0aW9uYWwgcHJlc2VuY2UiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwgDQogICAgICAgZmlsbCA9ICJQYXJ0bmVycyIpDQoNCg0KZ2dwbG90bHkocGFydG5lcl9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKHN1bV9zdGF0cyRwYXJ0bmVycywgIiBFaUUgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGFjcm9zcyAiLCBzdW1fc3RhdHMkY291bnRpZXMsICIgY291bnRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUsICI7IG1vdXNlIG92ZXIgY291bnR5IG5hbWUgZm9yIG1vcmUgZGV0YWlscyIsICI8L3N1cD4iKSkpDQpgYGANCg0KPGJyPg0KDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSB0YWJsZSB3aGljaCBhZGRzIGRldGFpbCB0byB0aGUgbWFwIGFib3ZlLCBzZXJ2aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNvb3JkaW5hdGlvbiAtLSBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc2VhcmNoIGJ5IGNvdW50eSBvciBwYXJ0bmVyLg0KDQpUaGUgY29sdW1uIGAjQWN0aXZpdGllc2AgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgRWR1Y2F0aW9uIGFjdGl2aXRpZXMgaW1wbGVtZW50ZWQgYnkgc2FpZCBwYXJ0bmVyIGluIGVhY2ggY291bnR5LiBFYWNoIGNvbHVtbiBjYW4gYmUgc29ydGVkIHdpdGggdGhlIGFycm93cyBuZXh0IHRvIGVhY2ggY29sdW1uIG5hbWUuIEVhY2ggY29sdW1uIGNhbiBhbHNvIGJlIGZpbHRlcmVkIGJ5IHR5cGluZyBpbnRvIHRoZSBzZWFyY2ggYmFyIGJlbG93IGVhY2ggY29sdW1uIG5hbWUuIE9ubHkgY29tcGxldGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHdyaXRlX2NzdigiLi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YiKQ0KYGBgDQoNCkRvd25sb2FkIHRoZSBkYXRhc2V0IGZyb20gdGhlIHRhYmxlIGJlbG93IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2VueWEtZWllLXdnL2VpZV93Z181d3MvYmxvYi9tYWluL2RhdGEvYnJlYWtkb3duX2J5X2NvdW50eV9wYXJ0bmVyLmNzdikuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiksIH4gDQogICAgICAgICAgICAgIHN0cl9zdWIoLiwgZW5kID0gNTBMKSkgJT4lICANCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KHBhcnRuZXIsIGFjcm9ueW0pLCANCiAgICAgICAgICAgIGJ5ID0gYygiaW1wbGVtZW50aW5nX3BhcnRuZXIiID0gInBhcnRuZXIiKSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBsZWFkX29yZ2FuaXNhdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGFjcm9ueW0sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHNlbGVjdF9hbGwoLiwgfiBzdHJfdG9fdGl0bGUoLikpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgY291bnR5IGFuZCBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJSZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygiUmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMiBTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyDQoNClRoZSB0YWJsZSBiZWxvdyBicmVha3MgZG93biBwZXJzb25zIHJlYWNoZWQgYnkgcGFydG5lci4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLjMgU3VtbWFyeSBieSBMZWFkIE9yZ2FuaXNhdGlvbg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGxlYWRfb3JnYW5pc2F0aW9uID0gc3RyX3N1YihsZWFkX29yZ2FuaXNhdGlvbiwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgbGVhZCBvcmdhbmlzYXRpb24iKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQogIA0KYGBgDQoNCiMgNC4gU2Nob29scyBhbmQgZWR1Y2F0aW9uIGxldmVsDQoNCiMjIDQuMSBTY2hvb2xzDQoNClRoZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IHNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyBpbnRlcnZlbnRpb25zIHRvLWRhdGUgYXJlOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG51bWJlcl9zY2hvb2xzKSkgJT4lDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDQiKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2Uoc2Nob29scyA9IHN1bShudW1iZXJfc2Nob29scyksIA0KICAgICAgICAgICAgcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9zY2hvb2xzID0gY3Vtc3VtKHNjaG9vbHMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fc2Nob29scyksIA0KICAgICAgICAgdmp1c3QgPSAtLjUpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICBhZXMoY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGN1bV9zY2hvb2xzKSksIHZqdXN0ID0gLS41KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzMxNjg4ZSIsICIjZDg1NzZiIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlNjaG9vbHMgcmVhY2hlZCBieSBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyIsIA0KICAgICAgIGNvbG91ciA9ICJJbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIHJlcG9ydGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IGFsbCBFaUUgaW50ZXJ2ZW50aW9ucyBpcyBtdWNoIG1vcmUgY2hhbGxlbmdpbmcuDQoNCldoaWxzdCBhbGwgcGFydG5lcnMgd29ya2luZyBvbiBpbmRpY2F0b3JzIDIgYW5kIDQgc3VibWl0dGVkIHRoZSBudW1iZXIgb2Ygc2Nob29scyB0aGV5IHdlcmUgd29ya2luZyBpbiwgdGhlIHNhbWUgaXMgbm90IHRydWUgZm9yIHRoZSBvdGhlciBpbmRpY2F0b3JzLiBPbmx5IGluZGljYXRvcnMgMiBhbmQgNCByZXF1aXJlIHRoZSByZXBvcnRpbmcgb2YgdGhlIG51bWJlciBvZiBzY2hvb2xzLg0KDQpBZGRpdGlvbmFsbHksIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBrbm93IHdoaWNoIG9mIHRoZXNlIHNjaG9vbHMgYXJlIHJlcGVhdHMsIHNpbmNlIG9ubHkgdGhlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgcGVyIHN1Yi1jb3VudHkgYXJlIHJlcG9ydGVkLCBub3QgdGhlIGluZGl2aWR1YWwgZmFjaWxpdGVzIHRoZW1zZWx2ZXMuDQoNCjxicj48YnI+PGJyPg0KDQojIDUuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMNCg0KIyMgNS4xIFJlZmVyZW5jZSBtYXBzDQoNCklQQyBkYXRhIGV4dHJhY3RlZCBmcm9tIFtoZXJlXShodHRwczovL3d3dy5pcGNpbmZvLm9yZy9pcGMtY291bnRyeS1hbmFseXNpcy9kZXRhaWxzLW1hcC9lbi9jLzExNTY1NDEvP2lzbzM9S0VOKS4NCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEwfQ0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG51bWJlcl9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShudW1iZXJfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIkF0IGxlYXN0XG5waGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBlcnNvbnMgSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsgDQoNCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGVyY2VudF9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQyBwaGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBwb3B1bGF0aW9uIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBzZWN0b3JfcmVhY2hlZCkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShzZWN0b3JfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yLA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzM5NDgzKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJTZWN0b3JcbnJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgdGhlIEVkdWNhdGlvbiBTZWN0b3IiKSArIA0KICANCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHJlYWNoZWQgPSAwLCB0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGMgPSBpZmVsc2UodGFyZ2V0ID09IDAsIDAsIHJlYWNoZWQgLyB0YXJnZXQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgb2YgdGFyZ2V0IiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBFaUUgY291bnR5IHRhcmdldCByZWFjaGVkIikgKyAgIA0KDQpwbG90X2xheW91dChuY29sID0gMiwgDQogICAgICAgICAgICBucm93ID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuMiBSZWZlcmVuY2UgdGFibGUNCg0KRG93bmxvYWQgdGhlIEVpRSA1V3MgZGF0YSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2VpZV81d3MuY3N2KQ0KDQpBcyBhIHJlZnJlc2hlciBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdywgdGhlIGluZGljYXRvcnMgYXJlOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUuMXw1LjJ8NS4zIikpICU+JSANCiAgZGlzdGluY3QoaW5kaWNhdG9yKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjg1LCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9udHNpemUoaSA9IDE6NywgaiA9IDEsIHNpemUgPSA5KSANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCksIA0KICAgICAgICAgaW5kaWNhdG9yX251bWJlciA9IHBhcnNlX251bWJlcihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgaW5kaWNhdG9yX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3IgPSBpbmRpY2F0b3JfbnVtYmVyLCByZWFjaGVkLCBhZG0xX3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGluZGljYXRvciwgY291bnR5IGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygicmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg==